package com.gccloud.design.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.common.utils.JacksonUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gccloud.design.dao.SdSchPriRelDao;
import com.gccloud.design.dao.SdSchemeDao;
import com.gccloud.design.dto.SSschemeSaveDto;
import com.gccloud.design.dto.SSschemeUpdateDto;
import com.gccloud.design.entity.SdSchPriRelEntity;
import com.gccloud.design.entity.SdSchemeEntity;
import com.gccloud.design.service.SdSchemeService;
import com.gccloud.design.vo.SdSchemeVO;
import com.gccloud.starter.common.dto.SearchDTO;
import com.gccloud.starter.common.utils.BeanConvertUtils;
import com.gccloud.starter.core.vo.PageVO;
import com.gccloud.starter.feign.api.service.ISysUserService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;


/**
 * @author mengyu
 * @date 2020/12/26 11:00
 */
@Service
public class SdSchemeServiceImpl extends ServiceImpl<SdSchemeDao, SdSchemeEntity> implements SdSchemeService {

    @Resource
    private SdSchemeDao sdSchemeDao;

    @Resource
    private SdSchPriRelDao sdSchPriRelDao;

    @Resource
    private ISysUserService iSysUserService;

    @Override
    public PageVO<SdSchemeVO> getAllScheme(SearchDTO searchDTO) {
        //1.获取查询条件转换成entity
        SdSchemeEntity sdSchemeEntity = JacksonUtils.toObj(searchDTO.getSearchKey(), SdSchemeEntity.class);

        //2。获取分页条件
        Page<SdSchemeEntity> searchPage = new Page<>(searchDTO.getCurrent(), searchDTO.getSize());

        IPage<SdSchemeVO> page = sdSchemeDao.getAllScheme(sdSchemeEntity, searchPage);

        return new PageVO<>(page);
    }

    @Transactional
    @Override
    public void saveScheme(SSschemeSaveDto sSschemeSaveDto) {
        SdSchemeEntity sschemeEntity = BeanConvertUtils.convert(sSschemeSaveDto, SdSchemeEntity.class);
        sschemeEntity.setCreatorId(iSysUserService.getCurrentUser().getData().getName());
        sdSchemeDao.saveScheme(sschemeEntity);

        if(sSschemeSaveDto.getPrinciple() != null && !"".equals(sSschemeSaveDto.getPrinciple())) {
            List<SdSchPriRelEntity> list = JSON.parseArray(sSschemeSaveDto.getPrinciple(), SdSchPriRelEntity.class);
            for (SdSchPriRelEntity p:list) {
                p.setSchemeId(sschemeEntity.getSchemeId());
                p.setShardingId(0);
                sdSchPriRelDao.insert(p);
            }
        }
    }

    @Transactional
    @Override
    public void updateScheme(SSschemeUpdateDto sSschemeUpdateDto) {

        SdSchemeEntity sschemeEntity = BeanConvertUtils.convert(sSschemeUpdateDto, SdSchemeEntity.class);
        sschemeEntity.setLastModUserid(iSysUserService.getCurrentUser().getData().getName());
        sschemeEntity.setLastModTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        sdSchemeDao.updateById(sschemeEntity);

        List<Integer> totalBySchemeId = sdSchPriRelDao.getTotalBySchemeId(sschemeEntity.getSchemeId());
        if (totalBySchemeId.size() > 0) {
            if (sSschemeUpdateDto.getPrinciple() != null && !"".equals(sSschemeUpdateDto.getPrinciple())) {
                List<SdSchPriRelEntity> list = JSON.parseArray(sSschemeUpdateDto.getPrinciple(), SdSchPriRelEntity.class);
                for (SdSchPriRelEntity p : list) {
                    QueryWrapper<SdSchPriRelEntity> wrapper = new QueryWrapper<>();
                    wrapper.eq("PRINCIPLE_ID", p.getPrincipleId());
                    sdSchPriRelDao.update(p, wrapper);
                }
            }
        } else {
            if (sSschemeUpdateDto.getPrinciple() != null && !"".equals(sSschemeUpdateDto.getPrinciple())) {
                List<SdSchPriRelEntity> list = JSON.parseArray(sSschemeUpdateDto.getPrinciple(), SdSchPriRelEntity.class);
                for (SdSchPriRelEntity p : list) {
                    sdSchPriRelDao.insert(p);
                }
            }
        }

    }

}
